const { PropertyModel, OrderModel } = require('../../models/index')

// 提交用户预约看房信息
const submitOrderInfo = async (req, res) => {
  try {
    // 预约看房信息为空的情况
    if (!req.body) {
      return res.status(400).json({ error: '预约看房信息不能为空！' })
    }

    // 同一个用户重复提交同一个房源的看房预约信息的情况
    const orderInfo = await OrderModel.findOne({
      where: {
        user_id: req.body.user_id,
        property_id: req.body.room_id
      }
    })

    if (orderInfo) {
      throw new Error('您已有该房源的预约记录，请不要重复预约')
    }

    // 使用正则表达式验证用户姓名，手机号，以及邮箱
    const nameRegex = /^(?:[\u4e00-\u9fa5·]{2,16})$/
    const phoneRegex = /^(?:(?:\+|00)86)?1[3-9]\d{9}$/
    const emailRegex = /^(([^<>()[\]\\.,;:\s@"]+(\.[^<>()[\]\\.,;:\s@"]+)*)|(".+"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/
    if (!nameRegex.test(req.body.name)) {
      throw new Error('请输入正确的姓名')
    }
    if (!phoneRegex.test(req.body.phone)) {
      throw new Error('请输入正确的手机号码')
    }
    if (!emailRegex.test(req.body.email)) {
      throw new Error('请输入正确的电子邮箱')
    }

    // 创建一个新的预约对象
    const orderObj = {
      property_id: req.body.room_id,
      user_id: req.body.user_id,
      user_name: req.body.name,
      user_phone: req.body.phone,
      user_email: req.body.email,
      order_date: req.body.datetime,
      user_remarks: req.body.remark,
    }

    // 保存预约信息到数据库
    const order = await OrderModel.create(orderObj)

    const submitResponse = {
      order_id: order.id,
      order_date: order.order_date,
      message: '预约看房信息已经成功提交'
    }

    // 提交成功的响应
    res.status(201).json({
      title: '提交成功',
      message: submitResponse
    })


  } catch (error) {
    return res.status(500).json({ error: error.message })
  }

}

// 获取用户看房预约信息
const getOrderInfo = async (req, res) => {
  try {
    const id = req.params.id

    // 获取页码和每页大小
    const { page, pageSize } = req.query

    // 用户ID不存在的情况
    if (!id || isNaN(parseInt(id, 10))) {
      return res.status(400).json({ error: '无效的用户ID' })
    }

    // 确保页码和每页大小是有效的数字
    if (isNaN(parseInt(page, 10)) || isNaN(parseInt(pageSize, 10)) || pageSize <= 0) {
      return res.status(400).json({ error: '无效的页码或每页大小' })
    }

    // 计算offset
    const offset = (parseInt(page, 10) - 1) * parseInt(pageSize, 10)

    // 查找用户的预约记录
    const orderInfo = await OrderModel.findAndCountAll({
      where: {
        user_id: id
      },
      include: [{
        model: PropertyModel,
        as: 'property',
        attributes: ['id', 'title', 'address', 'price']
      }],
      offset: offset,
      limit: parseInt(pageSize, 10)
    })

    // 没有找到预约信息的情况
    if (orderInfo.length === 0) {
      return res.status(404).json({ error: '没有找到预约信息！' })
    }

    // 返回预约信息查找成功时的响应
    res.status(200).json({
      title: '查询成功',
      data: orderInfo
    })

  } catch (error) {
    return res.status(500).json({ error: error.message })
  }
}

module.exports = {
  submitOrderInfo,
  getOrderInfo,
}